#ifndef _DEV_TOUCH_H_
#define _DEV_TOUCH_H_

#include "data_type.h"

/******************************************* 寄存器列表 *******************************************/
/* REG(W) */
#define DEV_TOUCH_CMD_CTRL_REG          0x8040  /* 命令控制寄存器 */
#define DEV_TOUCH_CMD_READ_COORD        0x0     /* 命令: 读取坐标 */
#define DEV_TOUCH_CMD_SOFT_RESET        0x2     /* 命令: 软件复位 */
#define DEV_TOUCH_CMD_CLOSE_INPUT       0x5     /* 命令: 关闭输入(关屏幕) */

/* REG(R) */
#define DEV_TOUCH_CONFIG_VERSION_REG    0x8047      /* 配置版本 */
#define DEV_TOUCH_X_OUTPUT_MAX_REG      0x8048      /* X坐标输出最大值 (Low + High) */
#define DEV_TOUCH_Y_OUTPUT_MAX_REG      0x804A      /* Y坐标输出最大值 (Low + High) */
#define DEV_TOUCH_PRODUCT_ID_REG        0x8140      /* 产品ID */
#define DEV_TOUCH_FIRMWARE_VERSION_REG  0x8144      /* 固件版本 */

#define DEV_TOUCH_POINTS_STATUS_REG     0x814E      /* 触摸点状态 */
#define DEV_TOUCH_POINT1_INFO_REG       0x814F      /* 触摸点1数据 */
#define DEV_TOUCH_POINT2_INFO_REG       0x8157      /* 触摸点2数据 */
#define DEV_TOUCH_POINT3_INFO_REG       0x815F      /* 触摸点3数据 */
#define DEV_TOUCH_POINT4_INFO_REG       0x8167      /* 触摸点4数据 */
#define DEV_TOUCH_POINT5_INFO_REG       0x816F      /* 触摸点5数据 */

/* user macro */
#define DEV_TOUCH_POINTS_INFO_SIZE      8           /* 每个触摸点信息的字节个数 */

/************************************** 其它宏定义(配置相关, 必读) *************************************/
/* 是否允许修改寄存器数据(数据会存在IC中, 断电不丢失!!!) */
#define DEV_TOUCH_CFG_REG_WR_DISABLE       0    /* 禁用 */
#define DEV_TOUCH_CFG_REG_WR_ENABLE        1    /* 允许 */
#define DEV_TOUCH_CFG_REG_WR_ACTION        DEV_TOUCH_CFG_REG_WR_ENABLE   /* 实测不能保存到IC中 */

/* 是否需要清空配置版本 */
#define DEV_TOUCH_CFG_VER_CLEAR_DISABLE 0   /* 禁用 */
#define DEV_TOUCH_CFG_VER_CLEAR_ENABLE  1   /* 使能 */
#define DEV_TOUCH_CFG_VER_CLEAR_ACTION  DEV_TOUCH_CFG_VER_CLEAR_DISABLE

/* 触摸点相关配置 */
#define DEV_TOUCH_MAX_POINT_NBR         5       /* 配置: 最大支持触摸点个数 */
#define DEV_TOUCH_MAX_X_RANGE           1024    /* 配置: X方向最大坐标 */   /* x > y 横屏 */
#define DEV_TOUCH_MAX_Y_RANGE           600     /* 配置: Y方向最大坐标 */

/* 触摸通知方式配置 */
#define DEV_TOUCH_NOTICE_REDGE          0        /* 上升沿触发 */
#define DEV_TOUCH_NOTICE_DEDGE          1        /* 下降沿触发 */
#define DEV_TOUCH_NOTICE_LPOLL          2        /* 低电平查询 */
#define DEV_TOUCH_NOTICE_HPOLL          3        /* 高电平查询 */
#define DEV_TOUCH_NOTICE_MODE           DEV_TOUCH_NOTICE_LPOLL  /* 配置触摸事件通知方式 */

/* X, Y轴数据是否交换 (涉及横屏和竖屏) */
#define DEV_TOUCH_X2Y_DISABLE           0        /* 不交换X, Y数据 */
#define DEV_TOUCH_X2Y_ENABLE            1        /* 交换X, Y数据 */
#define DEV_TOUCH_X2Y_ACTION            DEV_TOUCH_X2Y_DISABLE        /* (涉及横屏和竖屏) */

/* 是否需要打印所有寄存器(186个)配置数据 */
#define DEV_TOUCH_ALL_CFGREG_NBR           186 /* 所有需要配置的寄存器个数 */

#define DEV_TOUCH_ALL_CFGREG_PRINT_DISABLE 0   /* 禁用 */
#define DEV_TOUCH_ALL_CFGREG_PRINT_ENABLE  1   /* 使能 */
#define DEV_TOUCH_ALL_CFGREG_PRINT_ACTION  DEV_TOUCH_ALL_CFGREG_PRINT_DISABLE

/* 是否开启触摸点坐标调试模式(按配置最大触摸点个数输出) */
#define DEV_TOUCH_POINTS_DEBUG_DISABLE     0    /* 禁用 */
#define DEV_TOUCH_POINTS_DEBUG_ENABLE      1    /* 允许 */
#define DEV_TOUCH_POINTS_DEBUG_ACTION      DEV_TOUCH_POINTS_DEBUG_DISABLE  /* 开启将输出所有触摸点的坐标 */

/* 是否输出屏幕的信息 */
#define DEV_TOUCH_SHOW_INFO_DISABLE        0    /* 禁用 */
#define DEV_TOUCH_SHOW_INFO_ENABLE         1    /* 允许 */
#define DEV_TOUCH_SHOW_INFO_ACTION         DEV_TOUCH_SHOW_INFO_ENABLE  /* 开启将输出屏幕的信息 */

/* 等待重启时间(MS) */
#define DEV_TOUCH_WAIT_RESTART_TIME_MS     100

#define DEV_TOUCH_REG_NOB                  2       /* 每个寄存器的字节数 (number of bytes) */

/* 触摸点状态 */
enum
{
    DEV_TOUCH_PRESS_NONE = 0, /* 无状态 */
    DEV_TOUCH_PRESS_ABNOR,    /* 异常 */
    DEV_TOUCH_PRESS_OCCUR,    /* 按下 */
};

/* 触摸点事件状态 */
enum
{
    DEV_TOUCH_EVENT_NONE = 0,   /* 无事件 */
    DEV_TOUCH_EVENT_DOWN,       /* 按下 */
    DEV_TOUCH_EVENT_UP,         /* 松开 */
    DEV_TOUCH_EVENT_MOVE,       /* 移动 */
};

/* 触摸点坐标 */
typedef struct DEV_TOUCH_POINT
{
    dt_coord coord;     /* 坐标值 */
    uint8_t  track_id;  /* 跟踪id, 触摸记录并追踪, 离开解除 */
} dev_touch_point;
typedef dev_touch_point *dev_touch_point_t;

/* 设备驱动管理结构体 */
typedef struct DEV_RTDRV_TOUCH
{
    INIT_STATUS              init_status;                       /* 设备初始化状态 */
    uint8_t                  slave_addr;                        /* 从机地址 */
    struct rt_i2c_bus_device *i2c_bus;                          /* I2C总线设备句柄 */
    dev_touch_point          points[DEV_TOUCH_MAX_POINT_NBR];   /* 触摸点信息 */
    volatile uint8_t         touch_status;                      /* 触摸状态 */
    dt_coord                 coord_max;                         /* 最大坐标值 */
    uint8_t                  *cfg_params;                       /* 指向配置参数表 */
    uint16_t                 cfg_size;                          /* 配置参数表字节数 */
    char                     product_id[4];                     /* 产品ID */
    uint16_t                 firmware_version;                  /* 芯片固件版本 */
    uint8_t                  config_version;                    /* 配置文件版本号 */
} dev_rtdrv_touch;
typedef dev_rtdrv_touch *dev_rtdrv_touch_t;

/* 触摸设备初始化 */
RET_STATUS dev_touch_init(void);
/* 显示触摸设备信息 */
void dev_touch_show_info(void);
/* 软件复位 */
void dev_touch_soft_reset(void);
/* 设置触摸设备触摸状态 */
void dev_touch_set_press_status(uint8_t set_status);
/* 获得触摸设备触摸状态 */
uint8_t dev_touch_get_press_status(void);
/* 复位触摸设备触摸状态 */
void dev_touch_reset_press_status(void);
/* 扫描触摸点, 获得触摸点信息 */
void dev_touch_scan_points(dt_coord *coords, uint8_t *coords_nbr);

#endif
